package org.graduation.recruitment.controller;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import org.graduation.recruitment.entity.dto.UpdatePasswordDTO;
import org.graduation.recruitment.entity.dto.UserLoginDTO;
import org.graduation.recruitment.entity.dto.UserRegisterDTO;
import org.graduation.recruitment.entity.pojo.StudentUser;
import org.graduation.recruitment.service.StudentUserService;
import org.graduation.recruitment.utils.ResponseResult;
import org.graduation.recruitment.utils.Token;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

// RestController注解表示这是一个RESTful API控制器，@RequestMapping("/students")指定了控制器处理请求的基础路径
@RestController
@RequestMapping("/students")
@Slf4j
@Tag(name = "学生用户接口", description = "提供学生用户相关的CRUD操作")
@SecurityRequirement(name = "openApiSecurityScheme")
public class StudentUserController {

    // 通过@Autowired自动注入StudentUserService和Token服务
    @Autowired
    private StudentUserService studentUserService;
    @Autowired
    private Token token;

    /**
     * 学生用户注册接口
     *
     * @param dto 注册信息数据传输对象，包含用户的基本信息
     * @return 返回注册结果，成功则返回成功消息，失败则返回失败原因
     */
    @PostMapping("/register")
    @Operation(summary = "学生用户注册接口")
    public ResponseResult register(@RequestBody UserRegisterDTO dto) {
        log.info(dto.getUserType() + "用户" + dto.getAccount() + "注册");
        // 调用service层完成注册逻辑，根据结果返回成功或失败的响应
        if (studentUserService.register(dto)) {
            return ResponseResult.success();
        } else {
            log.warn(dto.getUserType() + "用户" + dto.getAccount() + "注册失败");
            return ResponseResult.fail("当前学号已被注册。");
        }
    }

    /**
     * 学生用户登录接口
     *
     * @param dto 登录信息数据传输对象，包含账号和密码
     * @return 登录成功返回token，失败返回错误消息
     */
    @PostMapping("/login")
    @Operation(summary = "学生用户登录接口")
    public ResponseResult login(@RequestBody UserLoginDTO dto) {
        log.info("用户" + dto.getAccount() + "登录");
        String tokenStr = studentUserService.login(dto);
        // 根据登录结果返回成功（含token）或失败消息
        if (tokenStr != null) {
            return ResponseResult.success(tokenStr);
        } else {
            return ResponseResult.fail("账号或者密码错误");
        }
    }

    /**
     * 学生用户通过token查看自己的信息
     *
     * @param tokenStr 用户的token，用于身份验证
     * @return 返回用户信息，如果不存在则返回失败消息
     */
    @GetMapping("/info")
    @Operation(summary = "学生用户通过token查看自己的信息")
    public ResponseResult getUserInfo(@RequestHeader("Authorization") String tokenStr) {
        log.info("用户token:" + tokenStr);
        StudentUser user = (StudentUser) studentUserService.getUserInfoByToken(tokenStr);
        // 根据用户信息存在与否返回成功（含用户信息）或失败消息
        if (user != null) {
            user.hidePassword();
            return ResponseResult.success(user);
        } else {
            return ResponseResult.fail("用户不存在");
        }
    }

    /**
     * 通过id查看学生用户的信息
     *
     * @param id 用户的ID
     * @return 返回用户信息，如果不存在则返回失败消息
     */
    @GetMapping("/info/{id}")
    @Operation(summary = "通过id查看学生用户的信息")
    public ResponseResult getUserInfoById(@PathVariable Long id) {
        StudentUser user = (StudentUser) studentUserService.getUserInfoById(id);
        // 根据用户信息存在与否返回成功（含用户信息）或失败消息
        if (user != null) {
            user.hidePassword();
            return ResponseResult.success(user);
        } else {
            return ResponseResult.fail("用户不存在");
        }
    }

    /**
     * 学生修改自己的信息
     *
     * @param studentUser 包含修改后信息的学生用户对象
     * @param tokenStr    用户的token，用于身份验证
     * @return 修改成功返回成功消息，失败返回失败原因
     */
    @PostMapping("/update")
    @Operation(summary = "学生修改自己的信息")
    public ResponseResult updateInfo(@RequestBody StudentUser studentUser, @RequestHeader("Authorization") String tokenStr) {
        studentUser.setId(token.getUidByToken(tokenStr));
        // 调用service层完成信息修改逻辑，根据结果返回成功或失败的响应
        if (studentUserService.updateInfo(studentUser)) {
            return ResponseResult.success();
        } else {
            return ResponseResult.fail("修改学生信息失败，请稍后再试");
        }
    }

    /**
     * 修改密码接口
     *
     * @param dto      包含旧密码和新密码的更新密码数据传输对象
     * @param tokenStr 用户的token，用于身份验证
     * @return 修改成功返回成功消息，失败返回失败原因
     */
    @PostMapping("/update/password")
    @Operation(summary = "修改密码接口")
    public ResponseResult updatePassword(@RequestBody UpdatePasswordDTO dto, @RequestHeader("Authorization") String tokenStr) {
        Long uid = token.getUidByToken(tokenStr);
        // 调用service层完成密码修改逻辑，根据结果返回成功或失败的响应
        if (studentUserService.updatePassword(uid, dto.getOldPassword(), dto.getNewPassword())) {
            return ResponseResult.success();
        } else {
            return ResponseResult.fail("修改密码失败，请稍后再试");
        }
    }


}
